#include <iostream>
#include <thread>
#include <atomic>
#include <string>
#include <functional>

#include "app.hpp"
#include "pipe.hpp"

using namespace wheels;
using namespace dm;
// 构造函数
pipeSvr::pipeSvr() : m_is_running__(false) {}

// 析构函数
pipeSvr::~pipeSvr() 
{
    // 确保线程停止
    start(false);
}

// 启动或停止后台线程
bool pipeSvr::start(bool sw) 
{
    if( m_is_running__ == sw ){
        MSG_1( "管道服务已%s" , sw ? "启动" : "停止" , TYELLOW );
        return true;
    }

    m_is_running__ = sw;

    if (sw) {
        m_thd__ = std::thread(&pipeSvr::backend__, this);
    } else {
        // 如果线程是可连接的，等待线程结束
        if (m_thd__.joinable()) {
            m_thd__.join();
        }
    }
    return true;
}

// 后台线程函数
void pipeSvr::backend__() 
{
    std::string line;
    
    // 当运行标志为true时持续读取数据
    auto ptapp = app_t::get_shared();
    if( !ptapp ){
        ERROR_MSG( "获取应用实例失败" );
        debug::printCallstack();
        return;
    }
    dispatch_t * dspt = ptapp->getDispatch();
    if( !dspt ){
        ERROR_MSG( "获取事件分发器失败" );
        debug::printCallstack();
        return;
    }
    while (m_is_running__) {
        // 从标准输入读取一行数据
        if (std::getline(std::cin, line)) {
            dspt->emit( emCmdType::DATA , line );
        } else { // 如果读取失败或遇到EOF，短暂休眠后继续尝试
            std::this_thread::sleep_for(std::chrono::milliseconds(100));
            // 清除错误状态并忽略可能的EOF
            if (std::cin.eof()) {
                std::cin.clear();
            }
        }
    }
}